; generated by Component: ARM Compiler 5.06 update 5 (build 528) Tool: ArmCC [4d3621]
; commandline ArmCC [--list --debug -c --asm --interleave -o.\obj\emac.o --asm_dir=.\Obj\ --list_dir=.\Obj\ --depend=.\obj\emac.d --cpu=Cortex-M3 --apcs=interwork -O3 --diag_suppress=9931 -I. -I.\Core_CM3 -IC:\Keil\ARM\RV31\INC -IC:\Keil\ARM\CMSIS\Include -IC:\Keil\ARM\INC\NXP -D__UVISION_VERSION=524 --omf_browse=.\obj\emac.crf ethernet\emac.c]
                          THUMB

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  write_PHY PROC
;;;91     //*****************************************************//
;;;92     void write_PHY (int PhyReg, int Value) {
000000  4af6              LDR      r2,|L1.988|
;;;93       unsigned int tout;
;;;94     
;;;95       /* if LPC175x then use software MIIM/MDIO */
;;;96       if (dev_175x == TRUE)
000002  6892              LDR      r2,[r2,#8]  ; dev_175x
000004  2a01              CMP      r2,#1
000006  d00e              BEQ      |L1.38|
;;;97       {
;;;98         mdio_write(PhyReg, Value);
;;;99       }
;;;100      /* use hardware MIIM/MDIO */
;;;101      else
;;;102      {
;;;103        LPC_EMAC->MADR = (PHY_ADDRESS<<8) | PhyReg;
000008  f04f42a0          MOV      r2,#0x50000000
00000c  f4407080          ORR      r0,r0,#0x100
000010  6290              STR      r0,[r2,#0x28]
;;;104        LPC_EMAC->MWTD = Value;
000012  62d1              STR      r1,[r2,#0x2c]
;;;105    
;;;106        /* Wait utill operation completed */
;;;107        tout = 0;
000014  2000              MOVS     r0,#0
;;;108        for (tout = 0; tout < MII_WR_TOUT; tout++) {
000016  1311              ASRS     r1,r2,#12
                  |L1.24|
;;;109          if ((LPC_EMAC->MIND & MIND_BUSY) == 0) {
000018  6b53              LDR      r3,[r2,#0x34]
00001a  07db              LSLS     r3,r3,#31
00001c  d002              BEQ      |L1.36|
00001e  1c40              ADDS     r0,r0,#1
000020  4288              CMP      r0,r1                 ;108
000022  d3f9              BCC      |L1.24|
                  |L1.36|
;;;110            break;
;;;111          }
;;;112        }
;;;113      }
;;;114    }
000024  4770              BX       lr
                  |L1.38|
000026  f7ffbffe          B.W      mdio_write
;;;115    
                          ENDP

                  read_PHY PROC
;;;116    unsigned short read_PHY (unsigned char PhyReg) {
00002a  49ec              LDR      r1,|L1.988|
00002c  b510              PUSH     {r4,lr}
;;;117      unsigned int tout;
;;;118      unsigned short Value;
;;;119    
;;;120      /* if LPC175x then use software MIIM/MDIO */
;;;121      if (dev_175x == TRUE)
00002e  6889              LDR      r1,[r1,#8]  ; dev_175x
000030  2901              CMP      r1,#1
000032  d013              BEQ      |L1.92|
;;;122      {
;;;123        Value = mdio_read(PhyReg);
;;;124      }
;;;125      /* use hardware MIIM/MDIO */
;;;126      else
;;;127      {
;;;128        LPC_EMAC->MADR = (PHY_ADDRESS<<8) | PhyReg;
000034  f4407180          ORR      r1,r0,#0x100
000038  f04f40a0          MOV      r0,#0x50000000
00003c  6281              STR      r1,[r0,#0x28]
;;;129        LPC_EMAC->MCMD = MCMD_READ;
00003e  2101              MOVS     r1,#1
000040  6241              STR      r1,[r0,#0x24]
;;;130    
;;;131        /* Wait until operation completed */
;;;132        tout = 0;
000042  2100              MOVS     r1,#0
;;;133        for (tout = 0; tout < MII_RD_TOUT; tout++) {
000044  1302              ASRS     r2,r0,#12
                  |L1.70|
;;;134          if ((LPC_EMAC->MIND & MIND_BUSY) == 0) {
000046  6b43              LDR      r3,[r0,#0x34]
000048  07db              LSLS     r3,r3,#31
00004a  d002              BEQ      |L1.82|
00004c  1c49              ADDS     r1,r1,#1
00004e  4291              CMP      r1,r2                 ;133
000050  d3f9              BCC      |L1.70|
                  |L1.82|
;;;135            break;
;;;136          }
;;;137        }
;;;138        LPC_EMAC->MCMD = 0;
000052  2100              MOVS     r1,#0
000054  6241              STR      r1,[r0,#0x24]
;;;139        Value = LPC_EMAC->MRDD;
000056  6b00              LDR      r0,[r0,#0x30]
                  |L1.88|
000058  b280              UXTH     r0,r0                 ;123
;;;140      }
;;;141    
;;;142      return Value;
;;;143    }
00005a  bd10              POP      {r4,pc}
                  |L1.92|
00005c  f7fffffe          BL       mdio_read
000060  e7fa              B        |L1.88|
;;;144    
                          ENDP

                  ReadFrame_EMAC PROC
;;;145    unsigned short ReadFrame_EMAC(void)
000062  4ade              LDR      r2,|L1.988|
;;;146    {
;;;147      return (*rxptr++);
000064  68d1              LDR      r1,[r2,#0xc]  ; rxptr
000066  f8310b02          LDRH     r0,[r1],#2
00006a  60d1              STR      r1,[r2,#0xc]  ; rxptr
;;;148    }
00006c  4770              BX       lr
;;;149    
                          ENDP

                  CopyFromFrame_EMAC PROC
;;;150    void CopyFromFrame_EMAC(void *Dest, unsigned short Size) {
00006e  b510              PUSH     {r4,lr}
000070  460b              MOV      r3,r1
;;;151      unsigned short * piDest;                       
;;;152    
;;;153      piDest = Dest;                                 
000072  4604              MOV      r4,r0
000074  e006              B        |L1.132|
;;;154      while (Size > 1) {
;;;155        *piDest++ = ReadFrame_EMAC();
000076  bf00              NOP      
                  |L1.120|
000078  f7fffffe          BL       ReadFrame_EMAC
00007c  1e9b              SUBS     r3,r3,#2
00007e  f8240b02          STRH     r0,[r4],#2
;;;156        Size -= 2;
000082  b29b              UXTH     r3,r3
                  |L1.132|
000084  2b01              CMP      r3,#1                 ;154
000086  d8f7              BHI      |L1.120|
;;;157      } 
;;;158      if (Size) {                                         
000088  2b00              CMP      r3,#0
00008a  d002              BEQ      |L1.146|
;;;159        *(unsigned char *)piDest = (char)ReadFrame_EMAC();
00008c  f7fffffe          BL       ReadFrame_EMAC
000090  7020              STRB     r0,[r4,#0]
                  |L1.146|
;;;160      }                                                   
;;;161    }
000092  bd10              POP      {r4,pc}
;;;162    
                          ENDP

                  same_mac PROC
;;;163    int same_mac(char * mac1,char * mac2) {
000094  b510              PUSH     {r4,lr}
;;;164      int i;
;;;165      
;;;166      for(i=0; i<6; i++) {
000096  2200              MOVS     r2,#0
                  |L1.152|
;;;167        if(mac1[i] != mac2[i])
000098  5c83              LDRB     r3,[r0,r2]
00009a  5c8c              LDRB     r4,[r1,r2]
00009c  42a3              CMP      r3,r4
00009e  d001              BEQ      |L1.164|
;;;168    	  return false;
0000a0  2000              MOVS     r0,#0
;;;169      }
;;;170      return true;
;;;171    }
0000a2  bd10              POP      {r4,pc}
                  |L1.164|
0000a4  1c52              ADDS     r2,r2,#1
0000a6  2a06              CMP      r2,#6                 ;166
0000a8  dbf6              BLT      |L1.152|
0000aa  2001              MOVS     r0,#1                 ;170
0000ac  bd10              POP      {r4,pc}
;;;172    
                          ENDP

                  filter_pass PROC
;;;173    int filter_pass(void) {
0000ae  b570              PUSH     {r4-r6,lr}
;;;174    
;;;175       if (!synchro)
0000b0  4dca              LDR      r5,|L1.988|
0000b2  7828              LDRB     r0,[r5,#0]  ; synchro
0000b4  2800              CMP      r0,#0
0000b6  d017              BEQ      |L1.232|
;;;176         return true;
;;;177    
;;;178       if(! same_mac(FRAMEr->source,HostMAC)) {
0000b8  4cc9              LDR      r4,|L1.992|
0000ba  f105011e          ADD      r1,r5,#0x1e
0000be  1da0              ADDS     r0,r4,#6
0000c0  f7fffffe          BL       same_mac
0000c4  b128              CBZ      r0,|L1.210|
;;;179    #if ETHERNET_DEBUG
;;;180    	 print("Frame from different MAC: Filtered out!\n");
;;;181    #endif   	
;;;182         return false;
;;;183       }
;;;184       if(PACKETr->destport != DestPort) {
0000c6  8ca0              LDRH     r0,[r4,#0x24]  ; rxbuffer
0000c8  88a9              LDRH     r1,[r5,#4]  ; DestPort
0000ca  4288              CMP      r0,r1
0000cc  d003              BEQ      |L1.214|
;;;185    #if ETHERNET_DEBUG
;;;186    	 print("Packet from different Destination Port: Filtered out!\n");
0000ce  a0c5              ADR      r0,|L1.996|
;;;187    #endif 
;;;188         return false;
0000d0  e006              B        |L1.224|
                  |L1.210|
0000d2  a0d2              ADR      r0,|L1.1052|
0000d4  e004              B        |L1.224|
                  |L1.214|
;;;189       }
;;;190       if(PACKETr->srcport != SrcPort) {
0000d6  8c60              LDRH     r0,[r4,#0x22]  ; rxbuffer
0000d8  88e9              LDRH     r1,[r5,#6]  ; SrcPort
0000da  4288              CMP      r0,r1
0000dc  d004              BEQ      |L1.232|
;;;191    #if ETHERNET_DEBUG
;;;192    	 print("Packet to different Source Port: Filtered out!\n");
0000de  a0da              ADR      r0,|L1.1096|
                  |L1.224|
0000e0  f7fffffe          BL       print
;;;193    #endif 
;;;194         return false;
0000e4  2000              MOVS     r0,#0
;;;195       }
;;;196       return true;
;;;197    }
0000e6  bd70              POP      {r4-r6,pc}
                  |L1.232|
0000e8  2001              MOVS     r0,#1                 ;196
0000ea  bd70              POP      {r4-r6,pc}
;;;198    
                          ENDP

                  WriteFrame_EMAC PROC
;;;199    void WriteFrame_EMAC(unsigned short Data)
0000ec  4abb              LDR      r2,|L1.988|
;;;200    {
;;;201      *txptr++ = Data;
0000ee  6911              LDR      r1,[r2,#0x10]  ; txptr
0000f0  f8210b02          STRH     r0,[r1],#2
0000f4  6111              STR      r1,[r2,#0x10]  ; txptr
;;;202    }
0000f6  4770              BX       lr
;;;203    
                          ENDP

                  CopyToFrame_EMAC PROC
;;;204    void CopyToFrame_EMAC(void *Source, unsigned int Size)
0000f8  b510              PUSH     {r4,lr}
;;;205    {
;;;206      unsigned short * piSource;
;;;207    
;;;208      piSource = Source;
0000fa  4604              MOV      r4,r0
;;;209      Size = (Size + 1) & 0xFFFE;    
0000fc  f64f70fe          MOV      r0,#0xfffe
000100  1c49              ADDS     r1,r1,#1
000102  ea010300          AND      r3,r1,r0
000106  e004              B        |L1.274|
                  |L1.264|
;;;210      while (Size > 0) {
;;;211        WriteFrame_EMAC(*piSource++);
000108  f8340b02          LDRH     r0,[r4],#2
00010c  f7fffffe          BL       WriteFrame_EMAC
000110  1e9b              SUBS     r3,r3,#2
                  |L1.274|
000112  2b00              CMP      r3,#0                 ;210
000114  d1f8              BNE      |L1.264|
;;;212        Size -= 2;
;;;213      }
;;;214    }
000116  bd10              POP      {r4,pc}
;;;215    
                          ENDP

                  chksum16 PROC
;;;216    int chksum16(void *buf1, short len) {
000118  b510              PUSH     {r4,lr}
;;;217      unsigned short * buf = buf1;
;;;218      int chksum16, chksum=0;
00011a  2200              MOVS     r2,#0
00011c  e00a              B        |L1.308|
                  |L1.286|
;;;219    
;;;220      while(len > 0) {	
;;;221        if (len == 1)
00011e  2901              CMP      r1,#1
000120  d00f              BEQ      |L1.322|
;;;222          chksum16 = ((*buf)&0x00FF);
;;;223        else
;;;224          chksum16 = (*buf);
000122  8803              LDRH     r3,[r0,#0]
                  |L1.292|
;;;225        chksum = chksum + HTONS(chksum16);
000124  1e89              SUBS     r1,r1,#2
000126  b2dc              UXTB     r4,r3
000128  0a1b              LSRS     r3,r3,#8
00012a  ea432304          ORR      r3,r3,r4,LSL #8
00012e  441a              ADD      r2,r2,r3
;;;226        *buf++;
;;;227        len -=2;
000130  b209              SXTH     r1,r1
000132  1c80              ADDS     r0,r0,#2
                  |L1.308|
000134  2900              CMP      r1,#0                 ;220
000136  dcf2              BGT      |L1.286|
;;;228      }
;;;229      return (~(chksum + ((chksum & 0xFFFF0000) >> 16))&0xFFFF);
000138  eb024012          ADD      r0,r2,r2,LSR #16
00013c  43c0              MVNS     r0,r0
00013e  b280              UXTH     r0,r0
;;;230    }
000140  bd10              POP      {r4,pc}
                  |L1.322|
000142  7803              LDRB     r3,[r0,#0]            ;222
000144  e7ee              B        |L1.292|
;;;231    
                          ENDP

                  init_emac PROC
;;;234    //*****************************************************//
;;;235    void init_emac(void)  {
000146  e92d47f0          PUSH     {r4-r10,lr}
;;;236      unsigned int regv,tout,id1,id2,i;
;;;237    
;;;238      synchro = false;
00014a  4fa4              LDR      r7,|L1.988|
;;;239    
;;;240    #if LED_ENABLED
;;;241      /* configure activity LED pin as output */
;;;242      LPC_GPIO2->FIODIR |= (1UL << PORT2_PIN);
00014c  4eca              LDR      r6,|L1.1144|
00014e  2500              MOVS     r5,#0                 ;238
000150  703d              STRB     r5,[r7,#0]            ;238
000152  6c30              LDR      r0,[r6,#0x40]
000154  f0400040          ORR      r0,r0,#0x40
000158  6430              STR      r0,[r6,#0x40]
;;;243    #endif
;;;244    
;;;245    #if ETHERNET_DEBUG
;;;246      UART_init(57600);
00015a  f44f4061          MOV      r0,#0xe100
00015e  f7fffffe          BL       UART_init
;;;247      print("Ethernet Secondary Bootloader: Target in debug mode\n");
000162  a0c6              ADR      r0,|L1.1148|
000164  f7fffffe          BL       print
;;;248    #endif 
;;;249    
;;;250      /* Power Up the EMAC controller. */
;;;251      LPC_SC->PCONP |= 0x40000000;
000168  48d2              LDR      r0,|L1.1204|
00016a  f8501fc4          LDR      r1,[r0,#0xc4]!
00016e  f0414180          ORR      r1,r1,#0x40000000
000172  6001              STR      r1,[r0,#0]
;;;252    
;;;253      /* configure ethernet pins */
;;;254      LPC_PINCON->PINSEL2 = 0x50150105;
000174  4cd1              LDR      r4,|L1.1212|
000176  48d0              LDR      r0,|L1.1208|
000178  60a0              STR      r0,[r4,#8]
;;;255    
;;;256      /* if device is an LPC175x then configure pins to use software */
;;;257      /* based MIIM/MDIO */
;;;258      if (is_LPC175x())
00017a  f7fffffe          BL       is_LPC175x
00017e  b150              CBZ      r0,|L1.406|
;;;259      {
;;;260        dev_175x = TRUE;
000180  2001              MOVS     r0,#1
;;;261        /* use P2.8 for MDC and P2.9 for MDIO */
;;;262        LPC_PINCON->PINSEL4 &= ~0x000F0000;
000182  60b8              STR      r0,[r7,#8]  ; dev_175x
000184  6920              LDR      r0,[r4,#0x10]
000186  f4202070          BIC      r0,r0,#0xf0000
00018a  6120              STR      r0,[r4,#0x10]
;;;263        LPC_GPIO2->FIODIR |= MDC;
00018c  6c30              LDR      r0,[r6,#0x40]
00018e  f4407080          ORR      r0,r0,#0x100
000192  6430              STR      r0,[r6,#0x40]
000194  e005              B        |L1.418|
                  |L1.406|
;;;264      }
;;;265      else
;;;266      {
;;;267        dev_175x = FALSE;
;;;268        /* configure pins for RMII and MIIM */
;;;269        LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & ~0x0000000F) | 0x00000005;
000196  60bd              STR      r5,[r7,#8]  ; dev_175x
000198  68e0              LDR      r0,[r4,#0xc]
00019a  f020000f          BIC      r0,r0,#0xf
00019e  1d40              ADDS     r0,r0,#5
0001a0  60e0              STR      r0,[r4,#0xc]
                  |L1.418|
;;;270      }
;;;271      
;;;272      /* Reset all EMAC internal modules. */
;;;273      LPC_EMAC->MAC1    = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX |
0001a2  f04f44a0          MOV      r4,#0x50000000
0001a6  f44f404f          MOV      r0,#0xcf00
0001aa  6020              STR      r0,[r4,#0]
;;;274                          MAC1_SIM_RES | MAC1_SOFT_RES;
;;;275      LPC_EMAC->Command = CR_REG_RES | CR_TX_RES | CR_RX_RES;
0001ac  2038              MOVS     r0,#0x38
0001ae  f8c40100          STR      r0,[r4,#0x100]
;;;276    
;;;277      /* A short delay after reset. */
;;;278      for (tout = 100; tout; tout--);
0001b2  2762              MOVS     r7,#0x62
                  |L1.436|
0001b4  1e7f              SUBS     r7,r7,#1
0001b6  d1fd              BNE      |L1.436|
;;;279    
;;;280      /* Initialize MAC control registers. */
;;;281      LPC_EMAC->MAC1 = MAC1_PASS_ALL;
0001b8  f04f0802          MOV      r8,#2
0001bc  f8c48000          STR      r8,[r4,#0]
;;;282      LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;
0001c0  2030              MOVS     r0,#0x30
0001c2  6060              STR      r0,[r4,#4]
;;;283      LPC_EMAC->MAXF = ETH_MAX_FLEN;
0001c4  f24050f2          MOV      r0,#0x5f2
0001c8  6160              STR      r0,[r4,#0x14]
;;;284      LPC_EMAC->CLRT = CLRT_DEF;
0001ca  f243700f          MOV      r0,#0x370f
0001ce  6120              STR      r0,[r4,#0x10]
;;;285      LPC_EMAC->IPGR = IPGR_DEF;
0001d0  2612              MOVS     r6,#0x12
0001d2  60e6              STR      r6,[r4,#0xc]
;;;286    
;;;287      /* Enable Reduced MII interface. */
;;;288      LPC_EMAC->Command = CR_RMII | CR_PASS_RUNT_FRM;
0001d4  0170              LSLS     r0,r6,#5
0001d6  f8c40100          STR      r0,[r4,#0x100]
;;;289    
;;;290      /* Put the PHY chip in reset mode */
;;;291      write_PHY (PHY_REG_BMCR, 0x8000);
0001da  f44f4100          MOV      r1,#0x8000
0001de  2000              MOVS     r0,#0
0001e0  f7fffffe          BL       write_PHY
;;;292    
;;;293      /* Wait for hardware reset to end. */
;;;294      for (tout = 0; tout < 0x100000; tout++) {
0001e4  f44f1980          MOV      r9,#0x100000
                  |L1.488|
;;;295        regv = read_PHY (PHY_REG_BMCR);
0001e8  2000              MOVS     r0,#0
0001ea  f7fffffe          BL       read_PHY
;;;296        if (!(regv & 0x8000)) {
0001ee  0400              LSLS     r0,r0,#16
0001f0  d502              BPL      |L1.504|
0001f2  1c7f              ADDS     r7,r7,#1
0001f4  454f              CMP      r7,r9                 ;294
0001f6  d3f7              BCC      |L1.488|
                  |L1.504|
;;;297          /* Reset complete */
;;;298          break;
;;;299        }
;;;300      }
;;;301     
;;;302      /* MII Mgmt Configuration register and MII Mgnt hardware Reset       */
;;;303      /* host clock divided by 20, no suppress preamble, no scan increment */
;;;304      LPC_EMAC->MCFG = HOST_CLK_BY_20 | MCFG_RES_MII;	
0001f8  f2480018          MOV      r0,#0x8018
0001fc  6220              STR      r0,[r4,#0x20]
;;;305      for ( i = 0; i < 0x40; i++ );
0001fe  2002              MOVS     r0,#2
                  |L1.512|
000200  1c40              ADDS     r0,r0,#1
000202  2840              CMP      r0,#0x40
000204  d3fc              BCC      |L1.512|
;;;306      LPC_EMAC->MCFG &= (~MCFG_RES_MII);	/* Clear the reset */
000206  6a20              LDR      r0,[r4,#0x20]
000208  f4204000          BIC      r0,r0,#0x8000
00020c  6220              STR      r0,[r4,#0x20]
;;;307      LPC_EMAC->MCMD = 0;	
00020e  6265              STR      r5,[r4,#0x24]
;;;308    
;;;309    #if(PHY_CHIP==0)  //National PHY
;;;310      /* Check if this is a DP83848C PHY. */
;;;311      id1 = read_PHY (PHY_REG_IDR1);
000210  2002              MOVS     r0,#2
000212  f7fffffe          BL       read_PHY
000216  4607              MOV      r7,r0
;;;312      id2 = read_PHY (PHY_REG_IDR2);
000218  2003              MOVS     r0,#3
00021a  f7fffffe          BL       read_PHY
;;;313      if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) {
00021e  f64f71f0          MOV      r1,#0xfff0
000222  4008              ANDS     r0,r0,r1
000224  49a6              LDR      r1,|L1.1216|
000226  ea404007          ORR      r0,r0,r7,LSL #16
00022a  4288              CMP      r0,r1
00022c  d10d              BNE      |L1.586|
;;;314        /* Configure the PHY device */
;;;315    
;;;316        /* Use autonegotiation about the link speed. */
;;;317        write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
00022e  f44f5140          MOV      r1,#0x3000
000232  2000              MOVS     r0,#0
000234  f7fffffe          BL       write_PHY
;;;318        /* Wait to complete Auto_Negotiation. */
;;;319        for (tout = 0; tout < 0x100000; tout++) {
000238  2700              MOVS     r7,#0
                  |L1.570|
;;;320          regv = read_PHY (PHY_REG_BMSR);
00023a  2001              MOVS     r0,#1
00023c  f7fffffe          BL       read_PHY
;;;321          if (regv & 0x0020) {
000240  0680              LSLS     r0,r0,#26
000242  d402              BMI      |L1.586|
000244  1c7f              ADDS     r7,r7,#1
000246  454f              CMP      r7,r9                 ;319
000248  d3f7              BCC      |L1.570|
                  |L1.586|
;;;322            /* Autonegotiation Complete. */
;;;323            break;
;;;324          }
;;;325        }
;;;326      }
;;;327      
;;;328      /* Check the link status. */
;;;329      for (tout = 0; tout < 0x10000; tout++) {
00024a  2700              MOVS     r7,#0
00024c  f44f3980          MOV      r9,#0x10000
                  |L1.592|
;;;330        regv = read_PHY (PHY_REG_STS);
000250  2010              MOVS     r0,#0x10
000252  f7fffffe          BL       read_PHY
;;;331        if (regv & 0x0001) {
000256  07c1              LSLS     r1,r0,#31
000258  d102              BNE      |L1.608|
00025a  1c7f              ADDS     r7,r7,#1
00025c  454f              CMP      r7,r9                 ;329
00025e  d3f7              BCC      |L1.592|
                  |L1.608|
;;;332          /* Link is on. */
;;;333          break;
;;;334        }
;;;335      }
;;;336    
;;;337      /* Configure Full/Half Duplex mode. */
;;;338      if (regv & 0x0004) {
000260  0741              LSLS     r1,r0,#29
000262  d50c              BPL      |L1.638|
;;;339        /* Full duplex is enabled. */
;;;340        LPC_EMAC->MAC2    |= MAC2_FULL_DUP;
000264  6861              LDR      r1,[r4,#4]
000266  f0410101          ORR      r1,r1,#1
00026a  6061              STR      r1,[r4,#4]
;;;341        LPC_EMAC->Command |= CR_FULL_DUP;
00026c  f8d41100          LDR      r1,[r4,#0x100]
000270  f4416180          ORR      r1,r1,#0x400
000274  f8c41100          STR      r1,[r4,#0x100]
;;;342        LPC_EMAC->IPGT     = IPGT_FULL_DUP;
000278  2115              MOVS     r1,#0x15
00027a  60a1              STR      r1,[r4,#8]
00027c  e000              B        |L1.640|
                  |L1.638|
;;;343      }
;;;344      else {
;;;345        /* Half duplex mode. */
;;;346        LPC_EMAC->IPGT = IPGT_HALF_DUP;
00027e  60a6              STR      r6,[r4,#8]
                  |L1.640|
;;;347      }
;;;348    
;;;349      /* Configure 100MBit/10MBit mode. */
;;;350      if (regv & 0x0002) {
000280  0780              LSLS     r0,r0,#30
000282  d501              BPL      |L1.648|
;;;351        /* 10MBit mode. */
;;;352        LPC_EMAC->SUPP = 0;
000284  61a5              STR      r5,[r4,#0x18]
000286  e002              B        |L1.654|
                  |L1.648|
;;;353      }
;;;354      else {
;;;355        /* 100MBit mode. */
;;;356        LPC_EMAC->SUPP = SUPP_SPEED;
000288  f44f7080          MOV      r0,#0x100
00028c  61a0              STR      r0,[r4,#0x18]
                  |L1.654|
;;;357      }
;;;358    #endif
;;;359    
;;;360    #if(PHY_CHIP==1)  //Other PHY
;;;361      /* Initialization code for other PHY */
;;;362    
;;;363    
;;;364    #endif
;;;365    
;;;366      /* Set the Ethernet MAC Address registers */
;;;367      LPC_EMAC->SA0 = (MYMAC_1 << 8) | MYMAC_2;
00028e  f241001f          MOV      r0,#0x101f
000292  6420              STR      r0,[r4,#0x40]
;;;368      LPC_EMAC->SA1 = (MYMAC_3 << 8) | MYMAC_4;
000294  f24e0012          MOV      r0,#0xe012
000298  6460              STR      r0,[r4,#0x44]
;;;369      LPC_EMAC->SA2 = (MYMAC_5 << 8) | MYMAC_6;
00029a  f641500c          MOV      r0,#0x1d0c
00029e  64a0              STR      r0,[r4,#0x48]
;;;370    
;;;371      /* save the Ethernet MAC Address to MyMAC[] */
;;;372      MyMAC[0] = MYMAC_6;
0002a0  484e              LDR      r0,|L1.988|
0002a2  210c              MOVS     r1,#0xc
0002a4  3018              ADDS     r0,r0,#0x18
;;;373      MyMAC[1] = MYMAC_5;
;;;374      MyMAC[2] = MYMAC_4;
;;;375      MyMAC[3] = MYMAC_3;
;;;376      MyMAC[4] = MYMAC_2;
;;;377      MyMAC[5] = MYMAC_1;
;;;378    
;;;379      /* Initialize Rx DMA Descriptors */
;;;380      for (i = 0; i < NUM_RX_FRAG; i++) {
;;;381        RX_DESC_PACKET(i)  = RX_BUF(i);
0002a6  4b87              LDR      r3,|L1.1220|
0002a8  7001              STRB     r1,[r0,#0]            ;372
0002aa  211d              MOVS     r1,#0x1d              ;373
0002ac  7041              STRB     r1,[r0,#1]            ;373
0002ae  7086              STRB     r6,[r0,#2]            ;374
0002b0  21e0              MOVS     r1,#0xe0              ;375
0002b2  70c1              STRB     r1,[r0,#3]            ;375
0002b4  211f              MOVS     r1,#0x1f              ;376
0002b6  7101              STRB     r1,[r0,#4]            ;376
0002b8  2110              MOVS     r1,#0x10              ;377
0002ba  7141              STRB     r1,[r0,#5]            ;377
;;;382        RX_DESC_CTRL(i)    = RCTRL_INT | (ETH_FRAG_SIZE-1);
0002bc  4e82              LDR      r6,|L1.1224|
0002be  4983              LDR      r1,|L1.1228|
0002c0  2000              MOVS     r0,#0                 ;380
0002c2  bf00              NOP                            ;381
                  |L1.708|
0002c4  ebc01200          RSB      r2,r0,r0,LSL #4       ;381
0002c8  eb0307c2          ADD      r7,r3,r2,LSL #3       ;381
0002cc  eb0102c0          ADD      r2,r1,r0,LSL #3       ;381
;;;383        RX_STAT_INFO(i)    = 0;
;;;384        RX_STAT_HASHCRC(i) = 0;
0002d0  1c40              ADDS     r0,r0,#1
0002d2  f8c250c8          STR      r5,[r2,#0xc8]
0002d6  f8c250cc          STR      r5,[r2,#0xcc]
0002da  e9c27600          STRD     r7,r6,[r2,#0]
0002de  2819              CMP      r0,#0x19              ;380
0002e0  d3f0              BCC      |L1.708|
;;;385      }
;;;386      /* Set EMAC Receive Descriptor Registers. */
;;;387      LPC_EMAC->RxDescriptor       = RX_DESC_BASE;
0002e2  f8c41108          STR      r1,[r4,#0x108]
;;;388      LPC_EMAC->RxStatus           = RX_STAT_BASE;
0002e6  4879              LDR      r0,|L1.1228|
0002e8  30c8              ADDS     r0,r0,#0xc8
0002ea  f8c4010c          STR      r0,[r4,#0x10c]
;;;389      LPC_EMAC->RxDescriptorNumber = NUM_RX_FRAG-1;
0002ee  2018              MOVS     r0,#0x18
0002f0  f8c40110          STR      r0,[r4,#0x110]
;;;390      /* Rx Descriptors Point to 0 */
;;;391      LPC_EMAC->RxConsumeIndex  = 0;
0002f4  f8c45118          STR      r5,[r4,#0x118]
;;;392    
;;;393      /* Initialize Tx DMA Descriptors */
;;;394      for (i = 0; i < NUM_TX_FRAG; i++) {
;;;395        TX_DESC_PACKET(i) = TX_BUF(i);
0002f8  4b75              LDR      r3,|L1.1232|
0002fa  2000              MOVS     r0,#0                 ;394
                  |L1.764|
0002fc  ebc01200          RSB      r2,r0,r0,LSL #4
000300  eb0306c2          ADD      r6,r3,r2,LSL #3
000304  eb0102c0          ADD      r2,r1,r0,LSL #3
000308  e9c26564          STRD     r6,r5,[r2,#0x190]
;;;396        TX_DESC_CTRL(i)   = 0;
;;;397        TX_STAT_INFO(i)   = 0;
00030c  eb010280          ADD      r2,r1,r0,LSL #2
000310  1c40              ADDS     r0,r0,#1
000312  f8c251a8          STR      r5,[r2,#0x1a8]        ;394
000316  2803              CMP      r0,#3                 ;394
000318  d3f0              BCC      |L1.764|
;;;398      }
;;;399      /* Set EMAC Transmit Descriptor Registers. */
;;;400      LPC_EMAC->TxDescriptor       = TX_DESC_BASE;
00031a  486a              LDR      r0,|L1.1220|
00031c  3824              SUBS     r0,r0,#0x24
00031e  f8c4011c          STR      r0,[r4,#0x11c]
;;;401      LPC_EMAC->TxStatus           = TX_STAT_BASE;
000322  4868              LDR      r0,|L1.1220|
000324  380c              SUBS     r0,r0,#0xc
000326  f8c40120          STR      r0,[r4,#0x120]
;;;402      LPC_EMAC->TxDescriptorNumber = NUM_TX_FRAG-1;
00032a  f8c48124          STR      r8,[r4,#0x124]
;;;403      /* Tx Descriptors Point to 0 */
;;;404      LPC_EMAC->TxProduceIndex  = 0;
00032e  f8c45128          STR      r5,[r4,#0x128]
;;;405    
;;;406      /* Receive Broadcast and Perfect Match Packets */
;;;407      LPC_EMAC->RxFilterCtrl = RFC_PERFECT_EN;  
000332  2020              MOVS     r0,#0x20
000334  f8c40200          STR      r0,[r4,#0x200]
;;;408    
;;;409      /* Enable EMAC interrupts. */
;;;410      LPC_EMAC->IntEnable = INT_RX_DONE | INT_TX_DONE;
000338  4966              LDR      r1,|L1.1236|
00033a  2088              MOVS     r0,#0x88
00033c  6008              STR      r0,[r1,#0]
;;;411    
;;;412      /* Reset all interrupts */
;;;413      LPC_EMAC->IntClear  = 0xFFFF;
00033e  1d09              ADDS     r1,r1,#4
000340  f64f70ff          MOV      r0,#0xffff
000344  6008              STR      r0,[r1,#0]
;;;414    
;;;415      /* Enable receive and transmit mode of MAC Ethernet core */
;;;416      LPC_EMAC->Command  |= (CR_RX_EN | CR_TX_EN);
000346  f8d40100          LDR      r0,[r4,#0x100]
00034a  f0400003          ORR      r0,r0,#3
00034e  f8c40100          STR      r0,[r4,#0x100]
;;;417      LPC_EMAC->MAC1     |= MAC1_REC_EN;
000352  6820              LDR      r0,[r4,#0]
000354  f0400001          ORR      r0,r0,#1
000358  6020              STR      r0,[r4,#0]
;;;418    
;;;419      /* Complete some IP & UDP header values */
;;;420      txbuffer[12] = 0x08;
00035a  4821              LDR      r0,|L1.992|
00035c  2108              MOVS     r1,#8
00035e  3078              ADDS     r0,r0,#0x78
000360  7301              STRB     r1,[r0,#0xc]
;;;421      txbuffer[13] = 0x00;
000362  7345              STRB     r5,[r0,#0xd]
;;;422      txbuffer[14] = 0x45;
000364  2145              MOVS     r1,#0x45
000366  7381              STRB     r1,[r0,#0xe]
;;;423      txbuffer[15] = 0x00;
000368  73c5              STRB     r5,[r0,#0xf]
;;;424      txbuffer[18] = 0xD8;
00036a  21d8              MOVS     r1,#0xd8
00036c  7481              STRB     r1,[r0,#0x12]
;;;425      txbuffer[19] = 0xF4;
00036e  21f4              MOVS     r1,#0xf4
000370  74c1              STRB     r1,[r0,#0x13]
;;;426      txbuffer[20] = 0x00;
000372  7505              STRB     r5,[r0,#0x14]
;;;427      txbuffer[21] = 0x00;
000374  7545              STRB     r5,[r0,#0x15]
;;;428      txbuffer[22] = 0x80;
000376  2180              MOVS     r1,#0x80
000378  7581              STRB     r1,[r0,#0x16]
;;;429      txbuffer[23] = 0x11;
00037a  2111              MOVS     r1,#0x11
00037c  75c1              STRB     r1,[r0,#0x17]
                  |L1.894|
;;;430    }
00037e  e8bd87f0          POP      {r4-r10,pc}
;;;431    
                          ENDP

                  emac_getline PROC
;;;433    // returns 0 if packet received, 1 if timeout
;;;434    unsigned emac_getline(char * buf,int max_len,int * count) {
000382  e92d5ff0          PUSH     {r4-r12,lr}
000386  4691              MOV      r9,r2
000388  460e              MOV      r6,r1
00038a  4680              MOV      r8,r0
;;;435      unsigned short RxLen;
;;;436      unsigned int idx, i;
;;;437    
;;;438    #if ETHERNET_DEBUG
;;;439      int j;
;;;440    #endif
;;;441    
;;;442    #if LED_ENABLED
;;;443      int k=0;
00038c  2700              MOVS     r7,#0
;;;444    #endif
;;;445     
;;;446      /* get timestamp for end of timeout period */
;;;447      ethernet_timeout = Timer_GetTimestamp() + ETHERNET_TIMEOUT;
00038e  f7fffffe          BL       Timer_GetTimestamp
000392  f8dfa048          LDR      r10,|L1.988|
000396  f64e2160          MOV      r1,#0xea60
00039a  4401              ADD      r1,r1,r0
;;;448    
;;;449      /* Check for Received frames */
;;;450      while(1){
;;;451        while(LPC_EMAC->RxConsumeIndex == LPC_EMAC->RxProduceIndex){
00039c  f04f4ba0          MOV      r11,#0x50000000
0003a0  f8ca1014          STR      r1,[r10,#0x14]        ;450  ; ethernet_timeout
0003a4  e0a0              B        |L1.1256|
                  |L1.934|
;;;452    #if LED_ENABLED
;;;453        // FIXME
;;;454        /* increment the counter and check timeout  */
;;;455    	  if (k++ > 200000) {
0003a6  4638              MOV      r0,r7
0003a8  494b              LDR      r1,|L1.1240|
0003aa  1c7f              ADDS     r7,r7,#1
0003ac  4288              CMP      r0,r1
0003ae  dd0d              BLE      |L1.972|
;;;456    	     k=0;
;;;457    		   /* toogle the LED           */
;;;458    	     if (LPC_GPIO2->FIOPIN & (1<<PORT2_PIN))
0003b0  4831              LDR      r0,|L1.1144|
0003b2  2700              MOVS     r7,#0                 ;456
0003b4  6d41              LDR      r1,[r0,#0x54]
0003b6  0649              LSLS     r1,r1,#25
0003b8  d504              BPL      |L1.964|
;;;459    	       LPC_GPIO2->FIOCLR |= (1<<PORT2_PIN);
0003ba  6dc1              LDR      r1,[r0,#0x5c]
0003bc  f0410140          ORR      r1,r1,#0x40
0003c0  65c1              STR      r1,[r0,#0x5c]
0003c2  e003              B        |L1.972|
                  |L1.964|
;;;460    	     else
;;;461    	       LPC_GPIO2->FIOSET |= (1<<PORT2_PIN);
0003c4  6d81              LDR      r1,[r0,#0x58]
0003c6  f0410140          ORR      r1,r1,#0x40
0003ca  6581              STR      r1,[r0,#0x58]
                  |L1.972|
;;;462    	  }
;;;463    #endif
;;;464    
;;;465    	  /* no filtered packets received during timeout period */
;;;466          if (Timer_HasTimestampExpired(ethernet_timeout))
0003cc  f8da0014          LDR      r0,[r10,#0x14]  ; ethernet_timeout
0003d0  f7fffffe          BL       Timer_HasTimestampExpired
0003d4  b100              CBZ      r0,|L1.984|
;;;467    	  {
;;;468    #if ETHERNET_DEBUG
;;;469            print("Timed out - going back to looking for handshake\n");
0003d6  e081              B        |L1.1244|
                  |L1.984|
0003d8  e086              B        |L1.1256|
0003da  0000              DCW      0x0000
                  |L1.988|
                          DCD      ||.data||
                  |L1.992|
                          DCD      ||.bss||
                  |L1.996|
0003e4  5061636b          DCB      "Packet from different Destination Port: Filtered out!\n"
0003e8  65742066
0003ec  726f6d20
0003f0  64696666
0003f4  6572656e
0003f8  74204465
0003fc  7374696e
000400  6174696f
000404  6e20506f
000408  72743a20
00040c  46696c74
000410  65726564
000414  206f7574
000418  210a    
00041a  00                DCB      0
00041b  00                DCB      0
                  |L1.1052|
00041c  4672616d          DCB      "Frame from different MAC: Filtered out!\n",0
000420  65206672
000424  6f6d2064
000428  69666665
00042c  72656e74
000430  204d4143
000434  3a204669
000438  6c746572
00043c  6564206f
000440  7574210a
000444  00      
000445  00                DCB      0
000446  00                DCB      0
000447  00                DCB      0
                  |L1.1096|
000448  5061636b          DCB      "Packet to different Source Port: Filtered out!\n",0
00044c  65742074
000450  6f206469
000454  66666572
000458  656e7420
00045c  536f7572
000460  63652050
000464  6f72743a
000468  2046696c
00046c  74657265
000470  64206f75
000474  74210a00
                  |L1.1144|
                          DCD      0x2009c000
                  |L1.1148|
00047c  45746865          DCB      "Ethernet Secondary Bootloader: Target in debug mode\n",0
000480  726e6574
000484  20536563
000488  6f6e6461
00048c  72792042
000490  6f6f746c
000494  6f616465
000498  723a2054
00049c  61726765
0004a0  7420696e
0004a4  20646562
0004a8  7567206d
0004ac  6f64650a
0004b0  00      
0004b1  00                DCB      0
0004b2  00                DCB      0
0004b3  00                DCB      0
                  |L1.1204|
                          DCD      0x400fc000
                  |L1.1208|
                          DCD      0x50150105
                  |L1.1212|
                          DCD      0x4002c000
                  |L1.1216|
                          DCD      0x20005c90
                  |L1.1220|
                          DCD      0x100041b4
                  |L1.1224|
                          DCD      0x80000077
                  |L1.1228|
                          DCD      0x10004000
                  |L1.1232|
                          DCD      0x10004d6c
                  |L1.1236|
                          DCD      0x50000fe4
                  |L1.1240|
                          DCD      0x00030d40
                  |L1.1244|
0004dc  a0ba              ADR      r0,|L1.1992|
0004de  f7fffffe          BL       print
;;;470    #endif
;;;471    	    return 1;
0004e2  2001              MOVS     r0,#1
                  |L1.1252|
;;;472    	  }
;;;473        }
;;;474    
;;;475        idx = LPC_EMAC->RxConsumeIndex;
;;;476    
;;;477        /* check for crc error */
;;;478    	if (RX_STAT_INFO(idx) & RINFO_CRC_ERR)
;;;479    	{
;;;480    #if ETHERNET_DEBUG
;;;481          print("Rx CRC error\n");
;;;482    #endif
;;;483          /* ignore frame */
;;;484          if (++idx == NUM_RX_FRAG)
;;;485      	  idx = 0;   
;;;486    	    LPC_EMAC->RxConsumeIndex = idx;
;;;487          continue;
;;;488    	}
;;;489    
;;;490        /* Get the Length and a pointer to the data  */
;;;491        RxLen = (RX_STAT_INFO(idx) & RINFO_SIZE) - 3;				 
;;;492        rxptr = (unsigned short *)RX_DESC_PACKET(idx);
;;;493        CopyFromFrame_EMAC(rxbuffer, RxLen);
;;;494        if (++idx == NUM_RX_FRAG)
;;;495    	  idx = 0;   
;;;496    	  LPC_EMAC->RxConsumeIndex = idx;
;;;497        if(filter_pass())
;;;498          break;
;;;499      } 
;;;500      /* limit incoming data for protection  */
;;;501      if ((RxLen-42) > max_len)
;;;502        RxLen = max_len + 42;
;;;503      memcpy(buf,PAYLOADr->data,RxLen-42);
;;;504    
;;;505      /* detect '0x0A' (string terminator) and replace it by CR+LF  */
;;;506      for(i=0;i<max_len;i++) {
;;;507        if(buf[i]==CR){
;;;508    	  buf[i]='\0';
;;;509    	  break;
;;;510    	}
;;;511      }
;;;512      (*count) = i;
;;;513    
;;;514    #if ETHERNET_DEBUG
;;;515      /* print received command   */
;;;516      print("Rx:  ");
;;;517      if (RxLen > 60) {
;;;518    	print("...Data...");
;;;519      }else{
;;;520        j=0;
;;;521        for(i=0; i<(*count); i++) {
;;;522    	  printascii(buf[i]);
;;;523          j++;
;;;524          if (j==16) {
;;;525            j=0;
;;;526            print("\r\n     ");
;;;527          }
;;;528        }
;;;529      }
;;;530      print("\r\n-------------------\r\n");
;;;531    #endif
;;;532    
;;;533        // reset timestamp for end of timeout period
;;;534        ethernet_timeout = Timer_GetTimestamp() + ETHERNET_TIMEOUT;
;;;535    
;;;536        return (0);
;;;537    }
0004e4  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.1256|
0004e8  f8db1118          LDR      r1,[r11,#0x118]       ;451
0004ec  4658              MOV      r0,r11                ;451
0004ee  f8db2114          LDR      r2,[r11,#0x114]       ;451
0004f2  4291              CMP      r1,r2                 ;451
0004f4  f43faf57          BEQ      |L1.934|
0004f8  f8d04118          LDR      r4,[r0,#0x118]        ;475
0004fc  48bf              LDR      r0,|L1.2044|
0004fe  eb0000c4          ADD      r0,r0,r4,LSL #3       ;478
000502  f8d010c8          LDR      r1,[r0,#0xc8]         ;478
000506  020a              LSLS     r2,r1,#8              ;478
000508  d509              BPL      |L1.1310|
00050a  a0bd              ADR      r0,|L1.2048|
00050c  f7fffffe          BL       print
000510  1c64              ADDS     r4,r4,#1              ;481
000512  2c19              CMP      r4,#0x19              ;484
000514  d100              BNE      |L1.1304|
000516  2400              MOVS     r4,#0                 ;485
                  |L1.1304|
000518  f8cb4118          STR      r4,[r11,#0x118]       ;486
00051c  e7e4              B        |L1.1256|
                  |L1.1310|
00051e  f3c1010a          UBFX     r1,r1,#0,#11          ;491
000522  1ec9              SUBS     r1,r1,#3              ;491
000524  b28d              UXTH     r5,r1                 ;491
000526  6801              LDR      r1,[r0,#0]            ;492
000528  f8ca100c          STR      r1,[r10,#0xc]         ;493  ; rxptr
00052c  4629              MOV      r1,r5                 ;493
00052e  48b8              LDR      r0,|L1.2064|
000530  f7fffffe          BL       CopyFromFrame_EMAC
000534  1c64              ADDS     r4,r4,#1              ;493
000536  2c19              CMP      r4,#0x19              ;494
000538  d100              BNE      |L1.1340|
00053a  2400              MOVS     r4,#0                 ;495
                  |L1.1340|
00053c  f8cb4118          STR      r4,[r11,#0x118]       ;496
000540  f7fffffe          BL       filter_pass
000544  2800              CMP      r0,#0                 ;497
000546  d0cf              BEQ      |L1.1256|
000548  f1a5002a          SUB      r0,r5,#0x2a           ;501
00054c  42b0              CMP      r0,r6                 ;501
00054e  dd02              BLE      |L1.1366|
000550  f106002a          ADD      r0,r6,#0x2a           ;502
000554  b285              UXTH     r5,r0                 ;502
                  |L1.1366|
000556  49ae              LDR      r1,|L1.2064|
000558  f1a5022a          SUB      r2,r5,#0x2a           ;503
00055c  312a              ADDS     r1,r1,#0x2a           ;503
00055e  4640              MOV      r0,r8                 ;503
000560  f7fffffe          BL       __aeabi_memcpy
000564  2000              MOVS     r0,#0                 ;506
000566  e004              B        |L1.1394|
                  |L1.1384|
000568  f8181000          LDRB     r1,[r8,r0]            ;507
00056c  290d              CMP      r1,#0xd               ;507
00056e  d00e              BEQ      |L1.1422|
000570  1c40              ADDS     r0,r0,#1              ;507
                  |L1.1394|
000572  42b0              CMP      r0,r6                 ;506
000574  d3f8              BCC      |L1.1384|
000576  bf00              NOP                            ;516
                  |L1.1400|
000578  f8c90000          STR      r0,[r9,#0]            ;516
00057c  a0a5              ADR      r0,|L1.2068|
00057e  f7fffffe          BL       print
000582  2d3c              CMP      r5,#0x3c              ;517
000584  d907              BLS      |L1.1430|
000586  a0a5              ADR      r0,|L1.2076|
000588  f7fffffe          BL       print
00058c  e016              B        |L1.1468|
                  |L1.1422|
00058e  2200              MOVS     r2,#0                 ;508
000590  f8082000          STRB     r2,[r8,r0]            ;508
000594  e7f0              B        |L1.1400|
                  |L1.1430|
000596  2500              MOVS     r5,#0                 ;520
000598  462c              MOV      r4,r5                 ;521
00059a  e00b              B        |L1.1460|
                  |L1.1436|
00059c  f8180004          LDRB     r0,[r8,r4]            ;522
0005a0  f7fffffe          BL       printascii
0005a4  1c6d              ADDS     r5,r5,#1              ;522
0005a6  2d10              CMP      r5,#0x10              ;524
0005a8  d103              BNE      |L1.1458|
0005aa  2500              MOVS     r5,#0                 ;525
0005ac  a09e              ADR      r0,|L1.2088|
0005ae  f7fffffe          BL       print
                  |L1.1458|
0005b2  1c64              ADDS     r4,r4,#1              ;526
                  |L1.1460|
0005b4  f8d90000          LDR      r0,[r9,#0]            ;521
0005b8  42a0              CMP      r0,r4                 ;521
0005ba  d8ef              BHI      |L1.1436|
                  |L1.1468|
0005bc  a09c              ADR      r0,|L1.2096|
0005be  f7fffffe          BL       print
0005c2  f7fffffe          BL       Timer_GetTimestamp
0005c6  f64e2160          MOV      r1,#0xea60            ;534
0005ca  4401              ADD      r1,r1,r0              ;534
0005cc  2000              MOVS     r0,#0                 ;536
0005ce  f8ca1014          STR      r1,[r10,#0x14]        ;536  ; ethernet_timeout
0005d2  e787              B        |L1.1252|
;;;538    
                          ENDP

                  emac_sendline_crlf PROC
;;;539    unsigned emac_sendline_crlf(char * buf) {  
0005d4  e92d47f0          PUSH     {r4-r10,lr}
;;;540      int i;
;;;541      unsigned int idx;
;;;542    
;;;543    #if ETHERNET_DEBUG
;;;544      int j;
;;;545    #endif
;;;546    
;;;547      /* detect '\0' (string terminator) and replace it by CR+LF  */
;;;548      for(i=0;i<CMD_SIZE;i++) {
;;;549        PAYLOADt->data[i] = buf[i] ;			
0005d8  4c8d              LDR      r4,|L1.2064|
0005da  2100              MOVS     r1,#0                 ;548
0005dc  4606              MOV      r6,r0                 ;539
0005de  3478              ADDS     r4,r4,#0x78
                  |L1.1504|
0005e0  1862              ADDS     r2,r4,r1
0005e2  5c70              LDRB     r0,[r6,r1]
0005e4  f882002a          STRB     r0,[r2,#0x2a]
;;;550        if(buf[i]=='\0'){
0005e8  5c70              LDRB     r0,[r6,r1]
0005ea  b168              CBZ      r0,|L1.1544|
0005ec  1c49              ADDS     r1,r1,#1
0005ee  2946              CMP      r1,#0x46              ;548
0005f0  dbf6              BLT      |L1.1504|
                  |L1.1522|
;;;551    	  PAYLOADt->data[i]=CR;
;;;552    	  PAYLOADt->data[i+1]=LF;
;;;553    	  break;
;;;554    	}
;;;555      }
;;;556      data_size = i+2;
0005f2  f8df8254          LDR      r8,|L1.2120|
0005f6  1c89              ADDS     r1,r1,#2
;;;557    
;;;558    #if ETHERNET_DEBUG
;;;559      print("Tx:  ");
0005f8  a094              ADR      r0,|L1.2124|
0005fa  f8a81002          STRH     r1,[r8,#2]            ;556
0005fe  f7fffffe          BL       print
;;;560      j=0;
000602  2700              MOVS     r7,#0
;;;561      for(i=0; i<data_size-2; i++) {
000604  463d              MOV      r5,r7
000606  e011              B        |L1.1580|
                  |L1.1544|
000608  1860              ADDS     r0,r4,r1              ;551
00060a  220d              MOVS     r2,#0xd               ;551
00060c  f8002f2a          STRB     r2,[r0,#0x2a]!        ;551
000610  220a              MOVS     r2,#0xa               ;552
000612  7042              STRB     r2,[r0,#1]            ;552
000614  e7ed              B        |L1.1522|
                  |L1.1558|
;;;562    	printascii(buf[i]);
000616  5d70              LDRB     r0,[r6,r5]
000618  f7fffffe          BL       printascii
00061c  1c7f              ADDS     r7,r7,#1
;;;563        j++;
;;;564        if (j==16) {
00061e  2f10              CMP      r7,#0x10
000620  d103              BNE      |L1.1578|
;;;565          j=0;
000622  2700              MOVS     r7,#0
;;;566          print("\r\n     ");
000624  a080              ADR      r0,|L1.2088|
000626  f7fffffe          BL       print
                  |L1.1578|
00062a  1c6d              ADDS     r5,r5,#1
                  |L1.1580|
00062c  f8b80002          LDRH     r0,[r8,#2]            ;561  ; data_size
000630  1e80              SUBS     r0,r0,#2              ;561
000632  4285              CMP      r5,r0                 ;561
000634  dbef              BLT      |L1.1558|
;;;567        }
;;;568      }
;;;569      print("\r\n-------------------\r\n");
000636  a07e              ADR      r0,|L1.2096|
000638  f7fffffe          BL       print
;;;570    #endif
;;;571        
;;;572      idx  = LPC_EMAC->TxProduceIndex;
00063c  f04f49a0          MOV      r9,#0x50000000
000640  f8d96128          LDR      r6,[r9,#0x128]
;;;573      txptr = (unsigned short *)TX_DESC_PACKET(idx);
000644  486d              LDR      r0,|L1.2044|
;;;574      TX_DESC_CTRL(idx) = FrameSize | TCTRL_LAST;
;;;575      memcpy(FRAMEt->destination,FRAMEr->source,6);
000646  4d72              LDR      r5,|L1.2064|
000648  eb0001c6          ADD      r1,r0,r6,LSL #3       ;573
00064c  4647              MOV      r7,r8                 ;573
00064e  f8d10190          LDR      r0,[r1,#0x190]        ;573
000652  f8c80010          STR      r0,[r8,#0x10]         ;574  ; txptr
000656  f8b80002          LDRH     r0,[r8,#2]            ;574  ; data_size
00065a  f100022a          ADD      r2,r0,#0x2a           ;574
00065e  f0424280          ORR      r2,r2,#0x40000000     ;574
000662  f8c12194          STR      r2,[r1,#0x194]
000666  f8551f06          LDR      r1,[r5,#6]!  ; rxbuffer
;;;576      memcpy(FRAMEt->source,MyMAC,6);
00066a  301c              ADDS     r0,r0,#0x1c
00066c  f8c51072          STR      r1,[r5,#0x72]         ;575  ; txbuffer
000670  88a9              LDRH     r1,[r5,#4]            ;575  ; rxbuffer
000672  f8a51076          STRH     r1,[r5,#0x76]         ;575
000676  f8d81018          LDR      r1,[r8,#0x18]  ; MyMAC
00067a  67a9              STR      r1,[r5,#0x78]  ; txbuffer
00067c  f8b8101c          LDRH     r1,[r8,#0x1c]  ; MyMAC
000680  f8a5107c          STRH     r1,[r5,#0x7c]
;;;577      PACKETt->iplen = HTONS(FrameSize - EtherHdrLen);
000684  f3c02107          UBFX     r1,r0,#8,#8
000688  ea412000          ORR      r0,r1,r0,LSL #8
00068c  8220              STRH     r0,[r4,#0x10]
;;;578      memcpy(PACKETt->destipaddr,PACKETr->srcipaddr,4);
00068e  4860              LDR      r0,|L1.2064|
000690  6969              LDR      r1,[r5,#0x14]  ; rxbuffer
000692  3080              ADDS     r0,r0,#0x80
;;;579      memcpy(PACKETt->srcipaddr,PACKETr->destipaddr,4);
;;;580      PACKETt->iphdrchksum = 0;
000694  f04f0800          MOV      r8,#0
000698  f8c01016          STR      r1,[r0,#0x16]         ;578  ; txbuffer
00069c  69a9              LDR      r1,[r5,#0x18]         ;579  ; rxbuffer
00069e  f8c01012          STR      r1,[r0,#0x12]         ;579  ; txbuffer
;;;581      PACKETt->iphdrchksum = HTONS(chksum16(PACKETt->fill1, IpHdrLen));
0006a2  1d80              ADDS     r0,r0,#6
0006a4  f8a48018          STRH     r8,[r4,#0x18]         ;580
0006a8  2114              MOVS     r1,#0x14
0006aa  4682              MOV      r10,r0
0006ac  f7fffffe          BL       chksum16
0006b0  f3c02c07          UBFX     r12,r0,#8,#8
0006b4  2114              MOVS     r1,#0x14
0006b6  4650              MOV      r0,r10
0006b8  f7fffffe          BL       chksum16
0006bc  ea4c2000          ORR      r0,r12,r0,LSL #8
0006c0  8320              STRH     r0,[r4,#0x18]
;;;582      PACKETt->destport = PACKETr->srcport;
0006c2  8ba8              LDRH     r0,[r5,#0x1c]  ; rxbuffer
0006c4  84a0              STRH     r0,[r4,#0x24]
;;;583      PACKETt->srcport = PACKETr->destport;
0006c6  8be8              LDRH     r0,[r5,#0x1e]  ; rxbuffer
0006c8  8460              STRH     r0,[r4,#0x22]
;;;584      PACKETt->udplen = HTONS(FrameSize - EtherHdrLen - IpHdrLen);
0006ca  8878              LDRH     r0,[r7,#2]  ; data_size
0006cc  4601              MOV      r1,r0
0006ce  3008              ADDS     r0,r0,#8
0006d0  f3c02207          UBFX     r2,r0,#8,#8
0006d4  ea422000          ORR      r0,r2,r0,LSL #8
0006d8  84e0              STRH     r0,[r4,#0x26]
;;;585      PACKETt->udpchksum = 0;
;;;586      CopyToFrame_EMAC(&txbuffer[0], FrameSize);
0006da  484d              LDR      r0,|L1.2064|
0006dc  f8a48028          STRH     r8,[r4,#0x28]         ;585
0006e0  3078              ADDS     r0,r0,#0x78
0006e2  312a              ADDS     r1,r1,#0x2a
0006e4  f7fffffe          BL       CopyToFrame_EMAC
0006e8  1c76              ADDS     r6,r6,#1
;;;587      if (++idx == NUM_TX_FRAG) idx = 0;
0006ea  2e03              CMP      r6,#3
0006ec  d100              BNE      |L1.1776|
0006ee  2600              MOVS     r6,#0
                  |L1.1776|
;;;588      LPC_EMAC->TxProduceIndex = idx;  
0006f0  f8c96128          STR      r6,[r9,#0x128]
;;;589      return (1);
0006f4  2001              MOVS     r0,#1
;;;590    }
0006f6  e642              B        |L1.894|
;;;591    
                          ENDP

                  emac_handshake PROC
;;;592    void emac_handshake(void) {
0006f8  b530              PUSH     {r4,r5,lr}
;;;593    
;;;594       int count;
;;;595       char buf[15];
;;;596       char buf1[15];
;;;597    
;;;598       synchro = false;
0006fa  4c53              LDR      r4,|L1.2120|
0006fc  b089              SUB      sp,sp,#0x24           ;592
0006fe  2000              MOVS     r0,#0
000700  7020              STRB     r0,[r4,#0]
                  |L1.1794|
;;;599    
;;;600       while(1) {
;;;601         if (emac_getline(buf,1,&count) == 0) {
000702  aa08              ADD      r2,sp,#0x20
000704  2101              MOVS     r1,#1
000706  4668              MOV      r0,sp
000708  f7fffffe          BL       emac_getline
00070c  2800              CMP      r0,#0
00070e  d1f8              BNE      |L1.1794|
;;;602           if (buf[0] == '?') {					  
000710  f89d0000          LDRB     r0,[sp,#0]
000714  283f              CMP      r0,#0x3f
000716  d1f4              BNE      |L1.1794|
;;;603      	     /* save Dest & Source Ports   */
;;;604     	     DestPort = PACKETr->destport;
000718  4d3d              LDR      r5,|L1.2064|
00071a  8ca8              LDRH     r0,[r5,#0x24]  ; rxbuffer
00071c  80a0              STRH     r0,[r4,#4]
;;;605    	     SrcPort  = PACKETr->srcport;
00071e  8c68              LDRH     r0,[r5,#0x22]  ; rxbuffer
000720  80e0              STRH     r0,[r4,#6]
;;;606    
;;;607    #if ETHERNET_DEBUG
;;;608             /* print Dest & Source Ports   */
;;;609    	     print("Dest: ");
000722  a04c              ADR      r0,|L1.2132|
000724  f7fffffe          BL       print
;;;610    	     printhexa((DestPort>>8)&0xFF);
000728  88a0              LDRH     r0,[r4,#4]  ; DestPort
00072a  0a00              LSRS     r0,r0,#8
00072c  f7fffffe          BL       printhexa
;;;611    	     printhexa(DestPort&0xFF);
000730  7920              LDRB     r0,[r4,#4]  ; DestPort
000732  f7fffffe          BL       printhexa
;;;612    	     print("\nSource: ");
000736  a049              ADR      r0,|L1.2140|
000738  f7fffffe          BL       print
;;;613    	     printhexa((SrcPort>>8)&0xFF);
00073c  88e0              LDRH     r0,[r4,#6]  ; SrcPort
00073e  0a00              LSRS     r0,r0,#8
000740  f7fffffe          BL       printhexa
;;;614    	     printhexa(SrcPort&0xFF);
000744  79a0              LDRB     r0,[r4,#6]  ; SrcPort
000746  f7fffffe          BL       printhexa
;;;615    	     print("\n");
00074a  a030              ADR      r0,|L1.2060|
00074c  f7fffffe          BL       print
;;;616    #endif
;;;617             /* save Host MAC address   */
;;;618    	     memcpy(HostMAC,FRAMEr->source,6);
000750  f8d50006          LDR      r0,[r5,#6]  ; rxbuffer
000754  f8c4001e          STR      r0,[r4,#0x1e]  ; HostMAC
000758  8968              LDRH     r0,[r5,#0xa]  ; rxbuffer
00075a  8460              STRH     r0,[r4,#0x22]
;;;619    
;;;620    #if ETHERNET_DEBUG
;;;621             /* print Host MAC address  */
;;;622    	     print("\nSource MAC: ");
00075c  a042              ADR      r0,|L1.2152|
00075e  f7fffffe          BL       print
;;;623    	     printhexa(HostMAC[5]);
000762  4d39              LDR      r5,|L1.2120|
000764  351e              ADDS     r5,r5,#0x1e
000766  7968              LDRB     r0,[r5,#5]  ; HostMAC
000768  f7fffffe          BL       printhexa
;;;624    	     printhexa(HostMAC[4]);
00076c  7928              LDRB     r0,[r5,#4]  ; HostMAC
00076e  f7fffffe          BL       printhexa
;;;625    	     printhexa(HostMAC[3]);
000772  78e8              LDRB     r0,[r5,#3]  ; HostMAC
000774  f7fffffe          BL       printhexa
;;;626    	     printhexa(HostMAC[2]);
000778  78a8              LDRB     r0,[r5,#2]  ; HostMAC
00077a  f7fffffe          BL       printhexa
;;;627    	     printhexa(HostMAC[1]);
00077e  7868              LDRB     r0,[r5,#1]  ; HostMAC
000780  f7fffffe          BL       printhexa
;;;628    	     printhexa(HostMAC[0]);
000784  7828              LDRB     r0,[r5,#0]  ; HostMAC
000786  f7fffffe          BL       printhexa
;;;629    	     print("\n");
00078a  a020              ADR      r0,|L1.2060|
00078c  f7fffffe          BL       print
;;;630    #endif
;;;631    
;;;632             emac_sendline_crlf((char *)&sync[0]);         
000790  4839              LDR      r0,|L1.2168|
000792  f7fffffe          BL       emac_sendline_crlf
;;;633             emac_getline(buf,15,&count);
000796  aa08              ADD      r2,sp,#0x20
000798  210f              MOVS     r1,#0xf
00079a  4668              MOV      r0,sp
00079c  f7fffffe          BL       emac_getline
;;;634    	     memcpy(&buf1[0],&sync[0],sizeof(sync));
0007a0  220d              MOVS     r2,#0xd
0007a2  4935              LDR      r1,|L1.2168|
0007a4  a804              ADD      r0,sp,#0x10
0007a6  f7fffffe          BL       __aeabi_memcpy
;;;635    	     if (str_cmp(&buf[0],&buf1[0])==0) {
0007aa  a904              ADD      r1,sp,#0x10
0007ac  4668              MOV      r0,sp
0007ae  f7fffffe          BL       str_cmp
0007b2  2800              CMP      r0,#0
0007b4  d1a5              BNE      |L1.1794|
;;;636               emac_sendline_crlf((char *)&Ok[0]);
0007b6  4830              LDR      r0,|L1.2168|
0007b8  1ec0              SUBS     r0,r0,#3
0007ba  f7fffffe          BL       emac_sendline_crlf
;;;637    		   synchro = true;
0007be  2001              MOVS     r0,#1
0007c0  7020              STRB     r0,[r4,#0]
;;;638    		   break;
;;;639    	     }
;;;640           }
;;;641    	 }
;;;642       }
;;;643    }
0007c2  b009              ADD      sp,sp,#0x24
0007c4  bd30              POP      {r4,r5,pc}
;;;644    
                          ENDP

0007c6  0000              DCW      0x0000
                  |L1.1992|
0007c8  54696d65          DCB      "Timed out - going back to looking for handshake\n",0
0007cc  64206f75
0007d0  74202d20
0007d4  676f696e
0007d8  67206261
0007dc  636b2074
0007e0  6f206c6f
0007e4  6f6b696e
0007e8  6720666f
0007ec  72206861
0007f0  6e647368
0007f4  616b650a
0007f8  00      
0007f9  00                DCB      0
0007fa  00                DCB      0
0007fb  00                DCB      0
                  |L1.2044|
                          DCD      0x10004000
                  |L1.2048|
000800  52782043          DCB      "Rx CRC error"
000804  52432065
000808  72726f72
                  |L1.2060|
00080c  0a00              DCB      "\n",0
00080e  00                DCB      0
00080f  00                DCB      0
                  |L1.2064|
                          DCD      ||.bss||
                  |L1.2068|
000814  52783a20          DCB      "Rx:  ",0
000818  2000    
00081a  00                DCB      0
00081b  00                DCB      0
                  |L1.2076|
00081c  2e2e2e44          DCB      "...Data...",0
000820  6174612e
000824  2e2e00  
000827  00                DCB      0
                  |L1.2088|
000828  0d0a2020          DCB      "\r\n     ",0
00082c  20202000
                  |L1.2096|
000830  0d0a2d2d          DCB      "\r\n-------------------\r\n",0
000834  2d2d2d2d
000838  2d2d2d2d
00083c  2d2d2d2d
000840  2d2d2d2d
000844  2d0d0a00
                  |L1.2120|
                          DCD      ||.data||
                  |L1.2124|
00084c  54783a20          DCB      "Tx:  ",0
000850  2000    
000852  00                DCB      0
000853  00                DCB      0
                  |L1.2132|
000854  44657374          DCB      "Dest: ",0
000858  3a2000  
00085b  00                DCB      0
                  |L1.2140|
00085c  0a536f75          DCB      "\nSource: ",0
000860  7263653a
000864  2000    
000866  00                DCB      0
000867  00                DCB      0
                  |L1.2152|
000868  0a536f75          DCB      "\nSource MAC: ",0
00086c  72636520
000870  4d41433a
000874  2000    
000876  00                DCB      0
000877  00                DCB      0
                  |L1.2168|
                          DCD      ||.constdata||+0x3

                          AREA ||.bss||, DATA, NOINIT, ALIGN=0

                  rxbuffer
                          %        120
                  txbuffer
                          %        120

                          AREA ||.constdata||, DATA, READONLY, ALIGN=0

                  ||Ok||
000000  4f4b00            DCB      0x4f,0x4b,0x00
                  sync
000003  53                DCB      0x53
000004  796e6368          DCB      0x79,0x6e,0x63,0x68
000008  726f6e69          DCB      0x72,0x6f,0x6e,0x69
00000c  7a656400          DCB      0x7a,0x65,0x64,0x00

                          AREA ||.data||, DATA, ALIGN=2

                  synchro
000000  0000              DCB      0x00,0x00
                  data_size
000002  0000              DCW      0x0000
                  DestPort
000004  0000              DCB      0x00,0x00
                  SrcPort
000006  0000              DCB      0x00,0x00
                  dev_175x
                          DCD      0x00000000
                  rxptr
                          DCD      0x00000000
                  txptr
                          DCD      0x00000000
                  ethernet_timeout
                          DCD      0x00000000
                  MyMAC
                          DCD      0x00000000
00001c  0000              DCB      0x00,0x00
                  HostMAC
00001e  0000              DCB      0x00,0x00
                          DCD      0x00000000
